package com.itheima.mp.domain.dto;


import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.vo.UserVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import lombok.Data;

import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

@Data
@ApiModel(description = "分页结果")
public class PageDTO<T> {

    @ApiModelProperty("总条数")
    private Long total;
    @ApiModelProperty("总页数")
    private Long pages;
    @ApiModelProperty("返回的数据")
    private List<T> data;

    /**
     *  2.1 创建PageDTO对象，传入参数
     *  PageDTO<UserVO> pageDTO = new PageDTO<>();
     *  pageDTO.setTotal(p.getTotal());
     *  pageDTO.setPages(p.getPages());
     *  //2.2 进行VO转化
     *  List<User> records = p.getRecords();
     *  if(CollUtil.isEmpty(records)){
     *      //获取的结果数据集合为空
     *      pageDTO.setData(Collections.emptyList());
     *  }else {
     *      List<UserVO> userVOS = BeanUtil.copyToList(records, UserVO.class);
     *      pageDTO.setData(userVOS);
     *  }
     *  2.3，返回数据
     *  return pageDTO;
     */

    //设置静态方法，直接由类调用
    public static <PO,VO> PageDTO<VO> of(Page<PO> p,Class<VO> clazz){

        //1 创建PageDTO对象，传入参数
        PageDTO<VO> pageDTO = new PageDTO<>();
        pageDTO.setTotal(p.getTotal());
        pageDTO.setPages(p.getPages());
        //2 进行VO转化
        List<PO> records = p.getRecords();
        if(CollUtil.isEmpty(records)){
            //获取的结果数据集合为空
            pageDTO.setData(Collections.emptyList());
        }else {
            pageDTO.setData(BeanUtil.copyToList(records, clazz));
        }
        //3，返回数据
        return pageDTO;
    }

    // Function<PO,VO> convertor 类型转换的逻辑 自己定义不要在方法中自动操作
    public static <PO,VO> PageDTO<VO> of(Page<PO> p, Function<PO,VO> convertor){

        //1 创建PageDTO对象，传入参数
        PageDTO<VO> pageDTO = new PageDTO<>();
        pageDTO.setTotal(p.getTotal());
        pageDTO.setPages(p.getPages());
        //2 进行VO转化
        List<PO> records = p.getRecords();
        if(CollUtil.isEmpty(records)){
            //获取的结果数据集合为空
            pageDTO.setData(Collections.emptyList());
            return pageDTO;
        }
        // 拷贝PO到VO
        pageDTO.setData(records.stream().map(convertor).collect(Collectors.toList()));
        //3，返回数据
        return pageDTO;
    }
}
